package com.afiorenza.collections.sets;

import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;

import com.afiorenza.Hijo;
import com.afiorenza.Padre;
import com.afiorenza.defaultTest;
import com.google.common.base.Stopwatch;

public class SetTests extends defaultTest {

	private int capacity = 100000;

	public Padre runTests() {

		// Stopwatch timer;

		System.out.println("Prueba Insersion HashSet de 1");
		HashSet<Hijo> hijos = new HashSet<Hijo>(1);
		timer = Stopwatch.createStarted();
		this.cargarHijos(hijos);
		System.out.println("Tiempo: " + timer.stop());

		System.out.println("Prueba Insersion HashSet de " + capacity);
		HashSet<Hijo> hijos2 = new HashSet<Hijo>(capacity);
		timer = Stopwatch.createStarted();
		this.cargarHijos(hijos);
		System.out.println("Tiempo: " + timer.stop());

		System.out.println("Prueba Insersion LinkedHashSet de " + capacity);
		// HashSet<Hijo> hijosLinkedHashSet = new HashSet<Hijo>(capacity);
		timer = Stopwatch.createStarted();
		LinkedHashSet<Hijo> hijosLinkedHashSet = new LinkedHashSet<Hijo>(capacity);
		this.cargarHijos(hijosLinkedHashSet);
		System.out.println("Tiempo: " + timer.stop());

		System.out.println("Prueba buscador sobre HashSet");
		Iterator<Hijo> iterator = hijos.iterator();
		timer = Stopwatch.createStarted();
		while (iterator.hasNext()) {
			Hijo hijo = iterator.next();
			buscarUnoEnSet(hijos, hijo);
		}
		System.out.println("Tiempo: " + timer.stop());

		System.out.println("Prueba buscador sobre LinkedHashSet");
		Iterator<Hijo> iteratoLinkedHashSet = hijos2.iterator();
		timer = Stopwatch.createStarted();
		while (iteratoLinkedHashSet.hasNext()) {
			Hijo hijo = iteratoLinkedHashSet.next();
			buscarUnoEnSet(hijosLinkedHashSet, hijo);
		}
		System.out.println("Tiempo: " + timer.stop());

		Padre padre = new Padre("Padre", 123, hijos);

		return padre;
	}

	private void cargarHijos(Set<Hijo> hijos) {
		Hijo hijo = null;
		for (int i = 0; i < capacity; i++) {
			hijo = new Hijo("Nombre" + i, i, "Escuela" + i);
			hijos.add(hijo);
		}
	}

	private <E> void buscarUnoEnSet(Set<E> e, E eABuscar) {

		if (e.contains(eABuscar)) {
			// System.out.println("Hijo encontrado");
		} else {
			// System.out.println("Hijo NO encontrado");
		}

	}

	
	@SuppressWarnings("unused")
	private void testJavaOcho(Set<Hijo> hijo) {
		System.out.println(hijo.stream().filter(e -> e.getDni() == 10));

	}
}
